匿名函数这种用完就扔的东西对内存很友好

您所在的位置:网站首页 nick jason 匿名函数这种用完就扔的东西对内存很友好

匿名函数这种用完就扔的东西对内存很友好

2024-06-15 10:50| 来源: 网络整理| 查看: 265

匿名函数 一、有名函数二、匿名函数三、与内置函数联用四、自定义sorted方法五、习题

一、有名函数

我们之前定的函数都是有名函数,它是基于函数名使用。

def func(): print('from func') func() func() func() print(func) from func from func from func 二、匿名函数

匿名函数,没有绑定特定名字,使用一次即被收回,加括号既可以运行。

lambda x, y: x+y res = (lambda x, y: x+y)(1, 2) print(res) 3 三、与内置函数联用

匿名函数通常与max()、sorted()、filter()、sorted()方法联用。 在这里插入图片描述

salary_dict = { 'nick': 3000, 'jason': 100000, 'tank': 5000, 'sean': 2000 } 如果我们想从上述字典中取出薪资最高的人,我们可以使用max()方法,但是max()默认比较的是字典的key。 首先将可迭代对象变成迭代器对象(就是取出可迭代对象的返回值)res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据 salary_dict = { 'nick': 3000, 'jason': 100000, 'tank': 5000, 'sean': 2000 } print(f"max(salary_dict): {max(salary_dict)}") def func(k): return salary_dict[k] print(f"max(salary_dict, key=func()): {max(salary_dict, key=func)}") # 'nick', v1 = func('nick') # 'jason', v2 = func('jason') # 'tank', v3 = func('tank') # 'sean', v4 = func('sean') print( f"max(salary_dict, key=lambda name: salary_dict[name]): {max(salary_dict, key=lambda name: salary_dict[name])}") max(salary_dict): tank max(salary_dict, key=func()): jason max(salary_dict, key=lambda name: salary_dict[name]): jason

2.如果我们想对上述字典中的人,按照薪资从大到小排序,可以使用sorted()方法。

sorted()工作原理:

首先将可迭代对象变成迭代器对象res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。 lis = [1, 3, 2, 5, 8, 6] sorted(lis) print(f"lis: {lis}") print(f"sorted(lis,reverse=True): {sorted(lis,reverse=True)}") lis: [1, 3, 2, 5, 8, 6] sorted(lis,reverse=True): [8, 6, 5, 3, 2, 1] salary_dict = { 'nick': 3000, 'jason': 100000, 'tank': 5000, 'sean': 2000 } print( f"sorted(salary_dict, key=lambda name: salary_dict[name]): {sorted(salary_dict, key=lambda name: salary_dict[name])}") sorted(salary_dict, key=lambda name: salary_dict[name]): ['sean', 'nick', 'tank', 'jason']

3.如果我们想对一个列表中的某个人名做处理,可以使用map()方法。

map()工作原理:

首先将可迭代对象变成迭代器对象res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。 name_list = ['jason', 'tank', 'sean'] res = map(lambda name: f"{name} sb", name_list) print(f"list(res): {list(res)}") list(res): ['jason sb', 'tank sb', 'sean sb']

4.如果我们想筛选除名字中含有’sb’的名字,我们可以使用filter()方法。

filter()工作原理:

首先将可迭代对象变成迭代器对象res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。 name_list = ['nick', 'jason sb', 'tank sb', 'sean sb'] filter_res = filter(lambda name: name.endswith('sb'), name_list) print(f"list(filter_res): {list(filter_res)}") list(filter_res): ['jason sb', 'tank sb', 'sean sb'] list(res): ['jason sb', 'tank sb', 'sean sb'] 四、自定义sorted方法 # 不太熟悉的同学不要看(有兴趣的可以看一看) def sorted(iter, key=None, reverse=None): iter.sort() if key: # key 是一个函数对象 lt = [] lt2 = [] for i in iter: res = key(i) lt.append(res) lt2.append(i) lt.sort() lt3 = [] for i in lt: for j in lt2: if j[1] == i: lt3.append(j) if reverse: lt3.reverse() return lt3 if reverse: iter.reverse() return iter salary_list = list(salary_dict.items()) print(salary_list) # [('nick', 3000), ('jason', 100000), ('tank', 5000), ('sean', 2000), ('z', 1000)] print(sorted(salary_list, key=lambda i: i[1], reverse=None)) # [('sean', 2000), ('nick', 3000), ('tank', 5000), ('jason', 100000)] 五、习题

文件内容如下,标题为:姓名, 性别, 年纪, 薪资

姓名性别年纪薪资nickmale183000ajsonmale3830000seanfemale2820000tankfemale2810000 要求: 从文件中取出每一条记录nick male 18 3000放入列表中, 列表的每个元素都是{'name':'nick','sex':'male','age':18,'salary':3000}的形式 #1 根据1得到的列表,取出薪资最高的人的信息 #2 根据1得到的列表,取出最年轻的人的信息 #3 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式 #4 根据1得到的列表,过滤掉名字以a开头的人的信息 #1 根据1得到的列表,取出薪资最高的人的信息 print(max(user_info_list, key=lambda item: item['salary'])) max_salary = 0 user_info_str = '' for user_info in user_info_list: if int(user_info['salary']) > max_salary: max_salary = int(user_info['salary']) user_info_str = user_info print(1, user_info_str) #2 根据1得到的列表,取出最年轻的人的信息 print(min(user_info_list, key=lambda item: item['age'])) #3 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式 print(list(map(lambda item: item['name'].title(), user_info_list))) #4 根据1得到的列表,过滤掉名字以a开头的人的信息 print(list(filter(lambda item: not(item['name'].startswith('a')), user_info_list))) for user_info in user_info_list: # type:dict if user_info['name'].startswith('a'): user_info_list.remove(user_info) print(user_info_list)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3